package com.commons;
/*

                  写字楼里写字间，写字间里程序员；
                  程序人'猿'写程序，又拿程序换酒钱。
                  酒醒只在网上坐，酒醉还来网下眠；
                  酒醉酒醒日复日，网上网下年复年。
                  但愿老死电脑间，不愿鞠躬老板前；
                  奔驰宝马贵者趣，公交自行程序员。
                  别人笑我忒疯癫，我笑自己命太贱；
                  不见满街漂亮妹，哪个归得程序'猿'？
━━━━━━神兽出没━━━━━━
 ┏┓   ┏┓
┏┛┻━━━┛┻┓
┃       ┃
┃   ━   ┃
┃ ┳┛ ┗┳ ┃
┃       ┃
┃   ┻   ┃
┃       ┃
┗━┓   ┏━┛
  ┃   ┃                    神兽保佑, 永无BUG!
  ┃   ┃       Code is far away from bug with the animal protecting
  ┃   ┗━━━┓
  ┃       ┣┓
  ┃       ┏┛
  ┗┓┓┏━┳┓┏┛
   ┃┫┫ ┃┫┫
   ┗┻┛ ┗┻┛
 */

/**
 * Created by 石头哥哥 on 6/8/16.
 * <p>
 * common
 * <p>
 * com.commons
 * <p>
 * comments:  数据库分库 分表 算法
 * 1.数据库分库 ,分表;
 * 具体参考 http://easygeek.com.cn/article/b2IjUf.html
 */
@SuppressWarnings("WeakerAccess")
public class DbHelper {

    /***
     * 这里除去冗余 ,采用"二叉分库" 1-2-4-8-16 ...
     * 分库数量为64,每个库针对数据库表为 10个表  (0~9)
     * 订单编号结构 :
     * 版本信息 +数据库编号  +  表信息 + 时间戳 + 机器编号 + 自增编号
     *  1         db1         1
     */

    /**
     * 根据UID 计算出 分库信息
     *
     * @param uid 用户ID
     * @return 返回数据库编号
     * <p>
     * db1 ,db2,db3,db4....
     */
    public static int getDbNumber(String uid) {
        return (((Integer.valueOf(uid) / 10) % 64 + 1) - 1) % 8 + 1;
    }


    /**
     * 根据UID计算出 计算出表序号
     *
     * @param uid 用户ID
     * @return 表序号
     */
    public static int getPartitionedTable(String uid) {
        return Integer.valueOf(uid) % 10;
    }

    /**
     * 查询订单辅助
     * 根据订单id获得分库信息
     */
    public static String getDBInfoByOrderId(String orderId) {
        return orderId.substring(1, 3);
    }

    /**查询订单辅助
     * 根据订单id获得分表信息
     */
    public static String getTableInfoByOrderId(String orderId) {
        return orderId.substring(3, 4);
    }

    /**
     * 测试
     *
     * @param args
     */
    public static void main(String[] args) {
        String uid = "953421";
        System.out.println("数据库编号DB" + getDbNumber(uid));
        System.out.println("数据库表order_" + getPartitionedTable(uid));
    }
}
